package org.example.servicepay.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.example.servicepay.entity.StudentFeeRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 学生缴费记录 Mapper 接口
 */
@Mapper
public interface StudentFeeRecordMapper extends BaseMapper<StudentFeeRecord> {

    /**
     * 根据学生ID查询缴费记录
     * @param studentId 学生ID
     * @return 缴费记录列表
     */
    List<StudentFeeRecord> selectByStudentId(@Param("studentId") String studentId);

    /**
     * 根据学生ID和状态查询缴费记录
     * @param studentId 学生ID
     * @param checkStatus 缴费状态
     * @return 缴费记录列表
     */
    List<StudentFeeRecord> selectByStudentIdAndStatus(@Param("studentId") String studentId, 
                                                     @Param("checkStatus") Integer checkStatus);

    /**
     * 根据缴费项目ID查询缴费记录
     * @param payId 缴费项目ID
     * @return 缴费记录列表
     */
    List<StudentFeeRecord> selectByPayId(@Param("payId") Long payId);

    /**
     * 查询学生的待缴费清单（包含缴费项目详情）
     * @param studentId 学生ID
     * @return 缴费记录列表（包含缴费项目信息）
     */
    List<StudentFeeRecord> selectUnpaidWithFeeItem(@Param("studentId") String studentId);

    /**
     * 查询学生的已缴费清单（包含缴费项目详情）
     * @param studentId 学生ID
     * @return 缴费记录列表（包含缴费项目信息）
     */
    List<StudentFeeRecord> selectPaidWithFeeItem(@Param("studentId") String studentId);

    /**
     * 更新缴费状态
     * @param studentId 学生ID
     * @param payId 缴费项目ID
     * @param checkStatus 新状态
     * @return 更新行数
     */
    int updateFeeStatus(@Param("studentId") String studentId, 
                       @Param("payId") Long payId,
                       @Param("checkStatus") Integer checkStatus);

    /**
     * 批量更新缴费状态
     * @param studentId 学生ID
     * @param payIds 缴费项目ID列表
     * @param checkStatus 新状态
     * @return 更新行数
     */
    int batchUpdateFeeStatus(@Param("studentId") String studentId,
                            @Param("payIds") List<Long> payIds,
                            @Param("checkStatus") Integer checkStatus);

    /**
     * 检查学生是否已有某个缴费项目的记录
     * @param studentId 学生ID
     * @param payId 缴费项目ID
     * @return 记录数量
     */
    int countByStudentAndPayId(@Param("studentId") String studentId, @Param("payId") Long payId);
}